package fr.charlott.view;

import org.primefaces.model.DashboardColumn;
import org.primefaces.model.DashboardModel;
import org.primefaces.model.DefaultDashboardColumn;
import org.primefaces.model.DefaultDashboardModel;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.PieChartModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import fr.charlott.business.dto.SaisonDTO;
import fr.charlott.business.service.ProduitService;
import fr.charlott.business.service.ReunionService;
import fr.charlott.core.repository.model.Collection;

@Component("statistiquesControler")
@Scope("view")
public class StatistiquesControler extends CharlottControler {

	private static final long serialVersionUID = 2465999191538831539L;

	/**
	 * Services
	 */
	private ProduitService produitService;
	
	private ReunionService reunionService;
	
	/**
	 * DashboardModel
	 */
	private DashboardModel model;  
	
	private PieChartModel nbProduitParCollectionModel;
	
	private CartesianChartModel chartCAReunionParMois;
	
	private SaisonDTO saisonCourante;

	public StatistiquesControler() {
		super();
	}

	@Autowired(required = true)
	public StatistiquesControler(ReunionService reunionService, ProduitService produitService, ApplicationControler applicationControler) {
		this();

		this.produitService = produitService;
		this.reunionService = reunionService;
		this.saisonCourante = applicationControler.getSaisonCourante();
		
		// Initialisation du dashboard
		model = new DefaultDashboardModel();  
		DashboardColumn column1 = new DefaultDashboardColumn();  
        DashboardColumn column2 = new DefaultDashboardColumn();
          
        column1.addWidget("CAReunionParMois"); 
        column2.addWidget("nbProduitsVendusParCollection");  
        model.addColumn(column1);
        model.addColumn(column2);
        
        nbProduitsVendusParCollection();
        caReunionParMois();
	}
	
	public DashboardModel getModel() {  
	    return model;  
	}  

	// actions
	
	public void nbProduitsVendusParCollection(){
		nbProduitParCollectionModel = new PieChartModel();  
		  
		nbProduitParCollectionModel.set(Collection.Attitude.getNom(), produitService.getNbProduitVenudusParCollection(Collection.Attitude, saisonCourante));  
		nbProduitParCollectionModel.set(Collection.Extreme.getNom(), produitService.getNbProduitVenudusParCollection(Collection.Extreme, saisonCourante)); 
		nbProduitParCollectionModel.set(Collection.ExtremeBain.getNom(), produitService.getNbProduitVenudusParCollection(Collection.ExtremeBain, saisonCourante)); 
		nbProduitParCollectionModel.set(Collection.Homme.getNom(), produitService.getNbProduitVenudusParCollection(Collection.Homme, saisonCourante)); 
	}
	
	public void caReunionParMois() {
		chartCAReunionParMois = new CartesianChartModel();
		ChartSeries ca = new ChartSeries();
		ca.setLabel("CA en euros");
		ca.set("Janv.", reunionService.chargerCAParMois(1));
		ca.set("Fév.", reunionService.chargerCAParMois(2));
		ca.set("Mar.", reunionService.chargerCAParMois(3));
		ca.set("Avr.", reunionService.chargerCAParMois(4));
		ca.set("Mai", reunionService.chargerCAParMois(5));
		ca.set("Juin", reunionService.chargerCAParMois(6));
		ca.set("Juil.", reunionService.chargerCAParMois(7));
		ca.set("Aout", reunionService.chargerCAParMois(8));
		ca.set("Sept.", reunionService.chargerCAParMois(9));
		ca.set("Oct.", reunionService.chargerCAParMois(10));
		ca.set("Nov.", reunionService.chargerCAParMois(11));
		ca.set("Déc.", reunionService.chargerCAParMois(12));
		chartCAReunionParMois.addSeries(ca);
	}

	// getters - setters

	public PieChartModel getNbProduitParCollectionModel() {
		return nbProduitParCollectionModel;
	}
	
	public CartesianChartModel getChartCAReunionParMois() {
		return chartCAReunionParMois;
	}
}
